package cn.openea.perpartner.cms.config;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

/**
 * @Name: COS数据存储的Bean配置定义类
 * @desc: 这里主要是使用了SpringBoot的容器来进行管理
 * @author: Mr.Yun
 * @Created: 2022/8/26 22:59
 */
@Configuration
public class CosConfig {

    @Value("${tencent.cos.secretId}")
    private String secretId;
    @Value("${tencent.cos.secretKey}")
    private String secretKey;
    @Value("${tencent.cos.region}")
    private String region;
    @Value("${tencent.cos.uploadPoolSize}")
    private int uploadPoolSize;

    @Autowired
    private ApplicationContext applicationContext;

    private static ExecutorService threadPool;

    @Bean
    public COSClient cosClient(){
        // 1 初始化用户身份信息（secretId, secretKey）。
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region cosregion = new Region(region);
        ClientConfig clientConfig = new ClientConfig(cosregion);
        // 这里建议设置使用 https 协议，从 5.6.54 版本开始，默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端 返回
        return new COSClient(cred, clientConfig);
    }

    @Bean
    public TransferManager createTransferManager(){
        // 从容器中获取对象
        COSClient cosClient = applicationContext.getBean(COSClient.class);
        // 自定义线程池大小，建议在客户端与 COS 网络充足（例如使用腾讯云的 CVM，同地域上传 COS）的情况下，设置成16或32即可，可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况，建议减小该值，避免因网速过慢，造成请求超时。
        //ExecutorService threadPool = Executors.newFixedThreadPool(uploadPoolSize);
        if(threadPool == null){
            threadPool = new ThreadPoolExecutor(1, uploadPoolSize,1L, TimeUnit.HOURS, new LinkedBlockingQueue<Runnable>());
        }
        // 传入一个 threadpool, 若不传入线程池，默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);
        // 设置高级接口的配置项
        // 分块上传阈值和分块大小分别为 5MB 和 1MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);
        transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);
        transferManager.setConfiguration(transferManagerConfiguration);
        return transferManager;
    }

}
